using System;
using System.Collections.Generic;
using System.Text;
using System.Data.SqlClient;
using System.Data.Sql;
using System.Data;
using CapaAccesoDatos;
//autor: Franklin Grassals
namespace CapaAccesoDatos.Clases
{
    public class TipoSancionCAD
    {
        //-------------------------------------------------------------------------------//
        // Propiedades de la Clase.                                                      //
        //-------------------------------------------------------------------------------//
        private int id;
        private string descripcion;
        private int duracion;

        //-------------------------------------------------------------------------------//
        // Accesores publicos de la Clase.                                               //
        //-------------------------------------------------------------------------------//
        public int ID
        {
            get { return id; }
            //set { id = value; }
        }
        public string Descripcion
        {
            get { return descripcion; }
            //set { descripcion = value; }
        }
        public int Duracion
        {
            get { return duracion; }
            //set { duracion = value; }
        }

        //-------------------------------------------------------------------------------//
        // Constructores de la Clase.                                                    //
        //-------------------------------------------------------------------------------//
        private TipoSancionCAD(int id, string desc, int dura)
        {
            this.id = id;
            this.descripcion = desc;
            this.duracion = dura;
        }

        private TipoSancionCAD(DataRow Registro)
        {
            this.id = Convert.ToInt32(Registro[Constantes.Tablas.Tipo_Sanciones.Campo_Id]);
            this.descripcion = Convert.ToString(Registro[Constantes.Tablas.Tipo_Sanciones.Campo_Descripcion]);
            this.duracion = Convert.ToInt32(Registro[Constantes.Tablas.Tipo_Sanciones.Campo_Duracion]);
        }

        private static void EjecutarQuery(SqlConnection conn, SqlCommand com)
        {
            //intento abrir la conexion, y si puedo, inserto los datos, sino tira una exepcion con
            //el problema
            SqlTransaction trans = null;
            try
            {
                //abro, inicio la transaccion, asigno la transaccion al comando y ejecuto el query.
                conn.Open();
                trans = conn.BeginTransaction();
                com.Transaction = trans;
                com.ExecuteNonQuery();

                trans.Commit();
            }
            catch (Exception Ex)
            {
                //si no se pudo hacer lo de arriba, devuelvo todo y tiro la excepcion
                trans.Rollback();
                throw new System.Exception("ERROR: Se ha producido un error en la conexion con la base de datos.\n " +
                           "FUNCION: Tipo_SancionCAD.EjecutarQuery(<args>)\n " +
                           "INNEREXCEPT:" + Ex.Message, Ex);
            }
            finally //cierro y limpio todo.
            {
                conn.Close();
                com.Dispose();
                conn.Dispose();
            }
        }

        //-------------------------------------------------------------------------------//
        //Metodos de la interface(despreciada a favor de metodos estaticos)              //
        //-------------------------------------------------------------------------------//
        public static void Save(TipoSancionCAD Objeto)
        {
            string cmd = "INSERT INTO " + Constantes.Tablas.Tipo_Sanciones.Nombre + "("+
                Constantes.Tablas.Tipo_Sanciones.Campo_Descripcion + ", " + 
                Constantes.Tablas.Tipo_Sanciones.Campo_Duracion + ") VALUES ('" + Objeto.Descripcion.Trim() + "', " + 
                Objeto.Duracion.ToString() + ")";

            SqlConnection connection = new SqlConnection(Constantes.ConnectionString);
            EjecutarQuery(connection, new SqlCommand(cmd, connection));
            return;
        }
        public static void Update(TipoSancionCAD Objeto)
        {
            string cmd = "UPDATE " + Constantes.Tablas.Tipo_Sanciones.Nombre + " SET "+
                Constantes.Tablas.Tipo_Sanciones.Campo_Descripcion + " = '" + Objeto.Descripcion.Trim() + "', " +
                Constantes.Tablas.Tipo_Sanciones.Campo_Duracion + " = " + Objeto.Duracion.ToString() +
                " WHERE " + Constantes.Tablas.Tipo_Sanciones.Campo_Id + " = " + Objeto.ID.ToString();

            SqlConnection connection = new SqlConnection(Constantes.ConnectionString);
            EjecutarQuery(connection, new SqlCommand(cmd, connection));
            return;
        }
        public static void Delete(TipoSancionCAD Objeto)
        {
            string cmd = "DELETE FROM " + Constantes.Tablas.Tipo_Sanciones.Nombre +
                " WHERE " + Constantes.Tablas.Tipo_Sanciones.Campo_Id + " = " + Objeto.ID.ToString();

            SqlConnection connection = new SqlConnection(Constantes.ConnectionString);
            EjecutarQuery(connection, new SqlCommand(cmd, connection));
            return;
        }

        //-------------------------------------------------------------------------------//
        // Estos son los metodos especiales para el uso de la Capa de Lenguaje de Negocios
        //-------------------------------------------------------------------------------//
        public static TipoSancionCAD BuscarPorId(int myId)
        {
            TipoSancionCAD result = null;
            string sqlCMD = "SELECT * FROM " + Constantes.Tablas.Tipo_Sanciones.Nombre +
                            " WHERE " + Constantes.Tablas.Tipo_Sanciones.Campo_Id +
                            " = " + myId.ToString();

            SqlConnection connection = new SqlConnection(Constantes.ConnectionString);
            SqlCommand command = new SqlCommand(sqlCMD, connection);
            SqlDataReader cursor = null;
            SqlTransaction transaccion = null;

            try
            {
                connection.Open();
                transaccion = connection.BeginTransaction();
                command.Transaction = transaccion;
                cursor = command.ExecuteReader(CommandBehavior.SingleRow);

                while (cursor.Read())
                {
                    result = new TipoSancionCAD(Convert.ToInt32(cursor[Constantes.Tablas.Tipo_Sanciones.Campo_Id]),
                                                 Convert.ToString(cursor[Constantes.Tablas.Tipo_Sanciones.Campo_Descripcion]),
                                                 Convert.ToInt32(cursor[Constantes.Tablas.Tipo_Sanciones.Campo_Duracion]));
                                                 
                }
                cursor.Close();
                transaccion.Commit();
            }
            catch (Exception Ex)
            {
                if (cursor != null)
                    cursor.Close();

                transaccion.Rollback();
                throw new System.Exception("ERROR: Se ha producido un error en la conexion con la base de datos.\n " +
                           "FUNCION: Tipo_SancionCAD.BuscarPorId(<args>)\n " +
                           "INNEREXCEPT:" + Ex.Message, Ex);
            }
            finally
            {
                connection.Close();
                command.Dispose();
                connection.Dispose();
            }
            return result;
        }

        public static List<TipoSancionCAD> BuscarTipo_SancionEnLista(List<int> Elementos)
        {
            List<TipoSancionCAD> Lista = new List<TipoSancionCAD>(); 
            DataSet Resultado = new DataSet();
            SqlConnection Conexion = new SqlConnection(Constantes.ConnectionString);
            SqlDataAdapter Adaptador = new SqlDataAdapter();
            SqlCommand ComandoSql = new SqlCommand("SELECT * FROM " + Constantes.Tablas.Tipo_Sanciones.Nombre +
                                                   " WHERE " + Constantes.Tablas.Tipo_Sanciones.Campo_Id +
                                                   " IN (", Conexion);
            //La sentencia es
            /*
             * SELECT * FROM Tipo_Sanciones WHERE Id IN :P1
             * Donde :P1 es el numero del Id! */

            SqlTransaction Tx = null;

            for (int i = 0; i < Elementos.Count; i++)
            {
                if (i == 0)
                    ComandoSql.CommandText += Elementos[i].ToString();
                else
                    ComandoSql.CommandText += "," + Elementos[i].ToString();
            }
            ComandoSql.CommandText += ")";

            try
            {
                Conexion.Open();
                Tx = Conexion.BeginTransaction();
                Adaptador.SelectCommand = ComandoSql;
                Adaptador.SelectCommand.Transaction = Tx;
                Adaptador.Fill(Resultado, Constantes.Tablas.Tipo_Sanciones.Nombre);
            }
            catch (Exception Ex)
            {
                Tx.Rollback();
                throw new System.Exception("ERROR: Se ha producido un error en la conexion con la base de datos.\n " +
                           "FUNCION: Tipo_SancionesCAD.BuscarTipoSancionesEnLista(<args>)\n " +
                           "INNEREXCEPT:" + Ex.Message, Ex);
            }
            finally
            {
                Conexion.Close();
                ComandoSql.Dispose();
                Conexion.Dispose();
                Adaptador.Dispose();
            }

            foreach (DataRow Row in Resultado.Tables[Constantes.Tablas.Tipo_Sanciones.Nombre].Rows)
            {
                Lista.Add(new TipoSancionCAD(Row));
            }
            return Lista;
            //return Resultado;
        }

        public static TipoSancionCAD CrearTipoSancionCAD(int id, string desc, int dura)
        {
            return new TipoSancionCAD(id, desc, dura);
        }

        public static TipoSancionCAD BuscarPorDuracion(int duracion)
        {
            TipoSancionCAD result = null;
            string sqlCMD = "SELECT * FROM " + Constantes.Tablas.Tipo_Sanciones.Nombre +
                            " WHERE " + Constantes.Tablas.Tipo_Sanciones.Campo_Duracion +
                            " = " + duracion.ToString();

            SqlConnection connection = new SqlConnection(Constantes.ConnectionString);
            SqlCommand command = new SqlCommand(sqlCMD, connection);
            SqlDataReader cursor = null;
            SqlTransaction transaccion = null;

            try
            {
                connection.Open();
                transaccion = connection.BeginTransaction();
                command.Transaction = transaccion;
                cursor = command.ExecuteReader(CommandBehavior.SingleRow);

                while (cursor.Read())
                {
                    result = new TipoSancionCAD(Convert.ToInt32(cursor[Constantes.Tablas.Tipo_Sanciones.Campo_Id]),
                                                 Convert.ToString(cursor[Constantes.Tablas.Tipo_Sanciones.Campo_Descripcion]),
                                                 Convert.ToInt32(cursor[Constantes.Tablas.Tipo_Sanciones.Campo_Duracion]));

                }
                cursor.Close();
                transaccion.Commit();
            }
            catch (Exception Ex)
            {
                if (cursor != null)
                    cursor.Close();

                transaccion.Rollback();
                throw new System.Exception("ERROR: Se ha producido un error en la conexion con la base de datos.\n " +
                           "FUNCION: Tipo_SancionCAD.BuscarPorDuracion(<args>)\n " +
                           "INNEREXCEPT:" + Ex.Message, Ex);
            }
            finally
            {
                connection.Close();
                command.Dispose();
                connection.Dispose();
            }
            return result;
        }
    }
}
